/* 
 * Autores:
 *      Jonathan Lopez  11106
 *      Jorge Martínez  11237
 * 
 * Archivo: RegRutas.java
 * Última Revision: $Rev: 64 $
 *      Fecha: $Date: 2011-09-18 02:32:49 +0000 (Sun, 18 Sep 2011) $
 */

package Manejo.Transporte.Registros;

import java.util.HashMap;
import java.util.ArrayList;

import Manejo.Transporte.Ruta;
import Archivador.*;

/**
 * Registro de todas las Rutas que existen en el programa.
 * 
 * @author Jonathan López
 * @author Jorge Martinez
 */
public class RegRutas {
    private HashMap<ID, Ruta> rutas;
    private final String nombreRegistro = "RegistroRutas";

    /**
     * Inicializa el registro de Rutas
     */
    public RegRutas()
    {
        rutas=new HashMap<ID, Ruta>();
    }

    /**
     * Inicializa el registro de Rutas
     * @param registroPuertos 
     */
    public void inicializar( Registros registros )
    {
        // Leer las rutas de la base de datos
        String[] infoRutas = Archivador.leerRegistro(nombreRegistro);
        if( infoRutas != null ){
            for( String linea: infoRutas ){
                if( !linea.equals("") && !leerRuta( linea, registros ) )
                    System.out.println("*ERROR RegRutas* - No se pudo leer Ruta");
            }
        }
    }
    
    /**
     * Guarda el registro de Rutas
     */
    public void guardarTodo(){
        // Serializa todas las rutas
        ArrayList<String> lineaRutas = new ArrayList<String>();
        
        for( ID idRuta: rutas.keySet() ){
            String srIdRuta = "[" + idRuta.guardar() + "]";
            String srRuta = rutas.get( idRuta ).guardar();
            String linea = srIdRuta + iArchivable.separadorObjetos + srRuta;
            lineaRutas.add(linea);
        }
        
        // Guarda el registro
        if( lineaRutas.isEmpty() )
            lineaRutas.add("");
        
        Archivador.guardarRegistro(nombreRegistro,
                lineaRutas.toArray( new String[0] ));
    }
    
    /**
     * Agrega una nueva Ruta al registro y le asigna un ID
     * @param nuevaRuta Ruta a agregar
     * @return nuevo ID de la ruta
     */
    public ID agregarRuta( Ruta nuevaRuta )
    {
        ID nuevoID = GeneradorID.nuevoID();
        while( rutas.containsKey( nuevoID ) ){
            // Muy improbable
            // TODO: notificar al log por cada uno de estos casos
            nuevoID = GeneradorID.nuevoID();
        }
        
        rutas.put( nuevoID, nuevaRuta );
        return nuevoID;
    }
    
    /**
     * Regresa la Ruta asociada con el ID dado
     * @param idRuta ID de la Ruta a buscar
     * @return Ruta asociada al ID o null si no se encuentra
     */
    public Ruta obtenerRuta( ID idRuta )
    {
        return rutas.get( idRuta );
    }
    
    /**
     * Regresa un arreglo con todas las rutas contenidas en el registro
     * @return Ruta[] con todas las rutas en el registro
     */
    public Ruta[] obtenerTodasRutas()
    {
        return rutas.values().toArray( new Ruta[0] );
    }
    
    /**
     * Regresa el ID de una Ruta
     * @param rutaObjetivo Ruta a evaluar
     * @return ID de la Ruta
     */
    public ID obtenerID( Ruta rutaObjetivo )
    {
        for( ID id: rutas.keySet() ){
            if( rutas.get(id).equals( rutaObjetivo) )
                return id;
        }
        
        return ID.idNulo;
    }
    
    /**
     * Elimina una Ruta del registro según su ID
     * @param idRuta ID de la ruta a eliminar
     * @return la Ruta asociada al ID dado, o null si no existía
     */
    public Ruta eliminarRuta( ID idRuta )
    {
        return rutas.remove( idRuta );
    }

    /**
     * Lee una sola Ruta a partir de una línea del registro
     * @param linea
     * @param registroPuertos
     * @return 
     */
    private boolean leerRuta(String linea, Registros registros)
    {
        // Trata de interpretar la ruta
        String[] partes = linea.split( iArchivable.separadorObjetos, 2 );
        if( partes.length != 2 )
            return false;
        
        // Interpreta el ID de la ruta
        String srID = partes[0];
        ID idRuta = ID.parseID( Util.eliminarExtremos(srID) );
        if( idRuta.equals( ID.idNulo ) )
            return false;
        
        // Interpreta la Ruta
        Ruta rutaActual = Ruta.parseRuta( partes[1], registros );
        if( rutaActual == null )
            return false;
        
        // Agrega la nueva ruta
        rutas.put(idRuta, rutaActual);
        return true;
    }
}
